package com.yungu.swift.common.util;

import com.aliyun.dyplsapi20170525.Client;
import com.aliyun.dyplsapi20170525.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.yungu.swift.common.model.vo.PrivacyPhoneVo;
import lombok.extern.slf4j.Slf4j;

import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Date;

/**
 * 阿里云隐私号码生成工具类
 */
@Slf4j
public class PrivacyPhoneUtil {

    //号码池数组
    public static final String[] poolKey = {"FC100000179264421", "FC100000179256453"};
    // 阿里云短信配置信息
    private static final String accessKeyId = "LTAI5tCBYwdW8chygfhTuW7u";
    private static final String accessKeySecret = "VQvg9kiXC8HQspjk3aZofT2NoX5I4o";

    /**
     * <b>description</b> :
     * <p>使用AK&amp;SK初始化账号Client</p>
     *
     * @return Client
     * @throws Exception
     */
    public static Client createClient() throws Exception {
        Config config = new Config()
                // 必填，请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
                .setAccessKeyId(accessKeyId)
                // 必填，请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
                .setAccessKeySecret(accessKeySecret);
        // Endpoint 请参考 https://api.aliyun.com/product/Dyplsapi
        config.endpoint = "dyplsapi.aliyuncs.com";
        return new Client(config);
    }

    /**
     * BindAxb- AXB中间号-号码绑定
     *
     * @return Client
     * @throws Exception
     */
    public static BindAxbResponseBody BindAxb(PrivacyPhoneVo privacyPhoneVo) throws Exception {
        Client client = createClient();
        BindAxbRequest bindAxbRequest = new BindAxbRequest()
                .setPoolKey(poolKey[privacyPhoneVo.getType()]) //号码池key
                .setPhoneNoA(privacyPhoneVo.getPhoneNoA()) //AXB 中间号的 A 号码。
                .setPhoneNoB(privacyPhoneVo.getPhoneNoB()) //AXB 中间号的 B 号码。
                .setExpiration(privacyPhoneVo.getExpiration().toString());//号码绑定的过期时间，默认设置当前时间之后一个小时
        log.info("A电话："+bindAxbRequest.getPhoneNoA());
        log.info("B电话："+bindAxbRequest.getPhoneNoB());
        log.info("号码池："+bindAxbRequest.getPoolKey());
        log.info("过期时间："+bindAxbRequest.getExpiration());
        try {
            // 复制代码运行请自行打印 API 的返回值
            BindAxbResponse bindAxbResponse = client.bindAxbWithOptions(bindAxbRequest, new RuntimeOptions());
            BindAxbResponseBody bindAxbResponseBody = bindAxbResponse.getBody();
            return bindAxbResponseBody;
        } catch (TeaException error) {
            // 此处仅做打印展示，请谨慎对待异常处理，在工程项目中切勿直接忽略异常。
            // 错误 message
            log.error(error.getMessage());
            // 诊断地址
            log.error((String) error.getData().get("Recommend"));
            log.error(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示，请谨慎对待异常处理，在工程项目中切勿直接忽略异常。
            // 错误 message
            log.error(error.getMessage());
            // 诊断地址
            log.error((String) error.getData().get("Recommend"));
            log.error(error.message);
        }
        return null;
    }

    /**
     * QuerySubscriptionDetail - 查询号码绑定详情
     *
     * @return Client
     * @throws Exception
     */
    public static QuerySubscriptionDetailResponseBody querySubscriptionDetail(PrivacyPhoneVo privacyPhoneVo) throws Exception {
        Client client = createClient();
        QuerySubscriptionDetailRequest querySubscriptionDetailRequest = new QuerySubscriptionDetailRequest()
                .setPoolKey(poolKey[privacyPhoneVo.getType()]) //号码池key
                .setSubsId(privacyPhoneVo.getSubsId()) //绑定关系 ID。
                .setPhoneNoX(privacyPhoneVo.getSecretNo()); // 绑定关系中的隐私号码,BindAxb 等号码绑定接口时查看返回参数中的 SecretNo。
        try {
            // 复制代码运行请自行打印 API 的返回值
            QuerySubscriptionDetailResponse querySubscriptionDetailResponse = client.querySubscriptionDetailWithOptions(querySubscriptionDetailRequest, new RuntimeOptions());
            QuerySubscriptionDetailResponseBody querySubscriptionDetailResponseBody = querySubscriptionDetailResponse.getBody();
            return querySubscriptionDetailResponseBody;
        } catch (TeaException error) {
            // 此处仅做打印展示，请谨慎对待异常处理，在工程项目中切勿直接忽略异常。
            // 错误 message
            log.error(error.getMessage());
            // 诊断地址
            log.error((String) error.getData().get("Recommend"));
            log.error(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 此处仅做打印展示，请谨慎对待异常处理，在工程项目中切勿直接忽略异常。
            // 错误 message
            log.error(error.getMessage());
            // 诊断地址
            log.error((String) error.getData().get("Recommend"));
            log.error(error.message);
        }
        return null;
    }

    /**
     * 获取当前一个小时后的时间
     *
     * @return String
     */
    public static String OneHourLater() {
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        // 添加一个小时
        LocalDateTime oneHourLater = now.plus(1, ChronoUnit.HOURS);
        // 创建一个DateTimeFormatter对象，指定格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 使用formatter将LocalDateTime格式化为字符串
        String formattedDateTime = oneHourLater.format(formatter);
        return formattedDateTime;
    }

    /**
     * 获取当前30分钟后的时间
     *
     * @return String
     */
    public static String thirtyMinutesLater() {
        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();
        // 添加30分钟
        LocalDateTime thirtyMinutesLater = now.plus(Duration.of(30, ChronoUnit.MINUTES));
        // 创建一个DateTimeFormatter对象，指定格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 使用formatter将LocalDateTime格式化为字符串
        String formattedDateTime = thirtyMinutesLater.format(formatter);
        return formattedDateTime;
    }

    /**
     * 比较时间点和当前时间大小
     *
     * @return String
     */
    public static boolean TimeStampConversionExample(String dateString) {
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = formatter.parse(dateString);
            long timestamp = date.getTime();
            long now = System.currentTimeMillis();
            if(timestamp > now) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}
